Service Network型VPCエンドポイントの作成が失敗しても使える時の裏側を確認してみた

Service Network型VPCエンドポイントの作成が失敗しても使える時の裏側を確認してみた

Service Network型VPCエンドポイントを作成する場合は、残りのIPアドレスの個数だけではなく残りの/28のCIDRブロックが重要
Clock Icon2024.12.20

Service Network型VPCエンドポイントの作成に失敗しているようだが、実際には通信できるんだが

こんにちは、のんピ(@non____97)です。

皆さんは「Service Network型VPCエンドポイントの作成に失敗しているようだが、実際には通信できるんだが」という場面に遭遇したことはありますか? 私はあります。

実際の様子は以下記事をご覧ください。

https://dev.classmethod.jp/articles/amazon-vpc-lattice-ssh/

この時は沼にハマりそうだと思い、深掘りはしなかったのですが、やはり気になってきました。

この裏側で何が起きていたのか調査してみます。

いきなりまとめ

  • Service Network型VPCエンドポイントを作成する場合は、残りのIPアドレスの個数だけではなく残りの/28のCIDRブロックが重要
    • VPCエンドポイントのENIそれぞれに/28のIPv4プレフィックス委任が設定されるため
  • Service Network型VPCエンドポイントを複数作成しようとすると、すぐにIPアドレスが枯渇する
    • 1つのService Networkに集約するか、Service Network型VPC Associationを使用しよう
  • 1つのサブネットに複数のENIを作成しようとする条件は不明

検証環境

検証環境は以下のとおりです。

Service Network型VPC Association.png

以前の記事と同じです。Service Network型VPCエンドポイント以外は作成済みの状態です。

サブネットマスクが/26で空きIPアドレスが60個程度あるサブネット2つ指定する

まず、サブネットマスクが/26で空きIPアドレスが60個程度あるサブネット2つ指定する場合で検証します。

これは前回の記事と同じ構成です。

試してみます。

# 空きIPアドレスの確認
> aws ec2 describe-subnets \
  --subnet-ids subnet-0a84d8f4554925b16 subnet-0f6a1ce53b9fd9793 \
  --query 'Subnets[].{SubnetId : SubnetId, AvailableIpAddressCount : AvailableIpAddressCount}'
[
    {
        "SubnetId": "subnet-0f6a1ce53b9fd9793",
        "AvailableIpAddressCount": 59
    },
    {
        "SubnetId": "subnet-0a84d8f4554925b16",
        "AvailableIpAddressCount": 57
    }
]

# VPCエンドポイントの作成
> aws ec2 create-vpc-endpoint \
  --vpc-endpoint-type ServiceNetwork \
  --service-network-arn arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09 \
  --vpc-id vpc-0d54cbe88a44ffd04 \
  --subnet-ids subnet-0a84d8f4554925b16 subnet-0f6a1ce53b9fd9793 \
  --security-group-ids sg-0e2239cc74c5c84f9 \
  --private-dns-enabled
{
    "VpcEndpoint": {
        "VpcEndpointId": "vpce-0e3b1bfc42d162c4a",
        "VpcEndpointType": "ServiceNetwork",
        "VpcId": "vpc-0d54cbe88a44ffd04",
        "State": "Pending",
        "SubnetIds": [
            "subnet-0a84d8f4554925b16",
            "subnet-0f6a1ce53b9fd9793"
        ],
        "Groups": [
            {
                "GroupId": "sg-0e2239cc74c5c84f9",
                "GroupName": "default"
            }
        ],
        "IpAddressType": "IPV4",
        "PrivateDnsEnabled": true,
        "CreationTimestamp": "2024-12-19T08:18:49.081000+00:00",
        "Tags": [],
        "OwnerId": "<AWSアカウントID>",
        "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
    }
}

# 失敗したことの確認
> aws ec2 describe-vpc-endpoints --vpc-endpoint-ids vpce-0e3b1bfc42d162c4a
{
    "VpcEndpoints": [
        {
            "VpcEndpointId": "vpce-0e3b1bfc42d162c4a",
            "VpcEndpointType": "ServiceNetwork",
            "VpcId": "vpc-0d54cbe88a44ffd04",
            "State": "Failed",
            "SubnetIds": [
                "subnet-0a84d8f4554925b16",
                "subnet-0f6a1ce53b9fd9793"
            ],
            "Groups": [
                {
                    "GroupId": "sg-0e2239cc74c5c84f9",
                    "GroupName": "default"
                }
            ],
            "IpAddressType": "IPV4",
            "PrivateDnsEnabled": true,
            "NetworkInterfaceIds": [
                "eni-0f995ce7b1b9589de",
                "eni-09199f7c86c4cddf9"
            ],
            "CreationTimestamp": "2024-12-19T08:18:49.081000+00:00",
            "Tags": [],
            "OwnerId": "<AWSアカウントID>",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
        }
    ]
}

# 失敗しても関連付けは正常に成功したことを確認
> aws ec2 describe-vpc-endpoint-associations --vpc-endpoint-ids vpce-0e3b1bfc42d162c4a
{
    "VpcEndpointAssociations": [
        {
            "Id": "vpce-rsc-asc-06a4438e30d46815f",
            "VpcEndpointId": "vpce-0e3b1bfc42d162c4a",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "ServiceNetworkName": "test-service-network-a",
            "AssociatedResourceAccessibility": "Accessible",
            "DnsEntry": {
                "DnsName": "vpce-0e3b1bfc42d162c4a-snra-0834edfa483e3c18a.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "HostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0f8b3049b4a9710e0"
        },
        {
            "Id": "vpce-rsc-asc-097ca8d41087fe203",
            "VpcEndpointId": "vpce-0e3b1bfc42d162c4a",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "ServiceNetworkName": "test-service-network-a",
            "AssociatedResourceAccessibility": "Accessible",
            "DnsEntry": {
                "DnsName": "vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "HostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0b39a245f47c880f8"
        },
        {
            "Id": "vpce-rsc-asc-09d942c31354b6c9f",
            "VpcEndpointId": "vpce-0e3b1bfc42d162c4a",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "ServiceNetworkName": "test-service-network-a",
            "AssociatedResourceAccessibility": "Accessible",
            "DnsEntry": {
                "DnsName": "vpce-0e3b1bfc42d162c4a-snra-051f07462219345e1.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "HostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-052f0211d381fbcfc"
        }
    ]
}

はい、ステータスはFailedになりましたが、関連付けは正常に成功しています。

VPCエンドポイントのDNS名の名前解決やSSHも可能です。

$ dig vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws

; <<>> DiG 9.18.28 <<>> vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49721
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws. IN A

;; ANSWER SECTION:
vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws. 60 IN A 10.10.10.31

;; Query time: 10 msec
;; SERVER: 10.10.10.2#53(10.10.10.2) (UDP)
;; WHEN: Thu Dec 19 14:49:27 UTC 2024
;; MSG SIZE  rcvd: 154

# ssh
$ ssh ec2-user@vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws -i ~/.ssh/non-97-test.pem

A newer release of "Amazon Linux" is available.
  Version 2023.6.20241212:
Run "/usr/bin/dnf check-release-update" for full release and version update info
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Thu Dec 19 09:05:16 2024 from 10.10.10.45
[ec2-user@ip-10-10-10-117 ~]$ hostname -i
10.10.10.117
[ec2-user@ip-10-10-10-117 ~]$ TOKEN=$(
  curl -X PUT "http://169.254.169.254/latest/api/token" \
    -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
    -s
  )
[ec2-user@ip-10-10-10-117 ~]$ curl \
  -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/instance-id
i-0ae4b4d9c4e67eef0[ec2-user@ip-10-10-10-117 ~]$ 

そのため、正直このままでも困らないです。

CloudTrailのイベントを見て何が起きているのか探っていきましょう。

1.CloudTrailイベント一覧.png

StartQueryPutEvaluationsは無視してください。

CreateVpcEndpointのリクエストを投げた後に裏側でVPCエンドポイントに紐づくENIを作成するためにCreateNetworkInterfaceCreateNetworkInterfacePermissionが動いていますね。

ただ、気になるのはCreateNetworkInterface17:19:11以降失敗し、最後にはDeleteNetworkInterfaceが実行されている点です。

CreateVpcEndpoint実行後に発生した17:18:5717:18:58CreateNetworkInterfaceを確認します。

1つ目
{
    "eventVersion": "1.10",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROA6KUFAVPUV2ZKYCUKD:LatticeAssumeRoleSession",
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/AWSServiceRoleForVpcLattice/LatticeAssumeRoleSession",
        "accountId": "<AWSアカウントID>",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROA6KUFAVPUV2ZKYCUKD",
                "arn": "arn:aws:iam::<AWSアカウントID>:role/aws-service-role/vpc-lattice.amazonaws.com/AWSServiceRoleForVpcLattice",
                "accountId": "<AWSアカウントID>",
                "userName": "AWSServiceRoleForVpcLattice"
            },
            "attributes": {
                "creationDate": "2024-12-19T08:18:56Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "vpc-lattice.amazonaws.com"
    },
    "eventTime": "2024-12-19T08:18:57Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateNetworkInterface",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "vpc-lattice.amazonaws.com",
    "userAgent": "vpc-lattice.amazonaws.com",
    "requestParameters": {
        "subnetId": "subnet-0a84d8f4554925b16",
        "description": "VPC Endpoint Interface vpce-0e3b1bfc42d162c4a",
        "groupSet": {
            "items": [
                {
                    "groupId": "sg-0e2239cc74c5c84f9"
                }
            ]
        },
        "privateIpAddressesSet": {},
        "ipv4PrefixCount": 1,
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "network-interface",
                    "tags": [
                        {
                            "key": "VpcLatticeManaged",
                            "value": "true"
                        }
                    ]
                }
            ]
        },
        "clientToken": "e1b4231c-0596-4c1c-8f7c-9685b54bf288-IAD7-attach-grp-iad7-0bb2c627af31f93c0-0",
        "denyAllIgwTraffic": true
    },
    "responseElements": {
        "requestId": "ab0bdbed-488c-4027-ba57-45ca932cd4cd",
        "networkInterface": {
            "networkInterfaceId": "eni-0f995ce7b1b9589de",
            "subnetId": "subnet-0a84d8f4554925b16",
            "vpcId": "vpc-0d54cbe88a44ffd04",
            "availabilityZone": "us-east-1a",
            "description": "VPC Endpoint Interface vpce-0e3b1bfc42d162c4a",
            "ownerId": "<AWSアカウントID>",
            "requesterId": "396074869647",
            "requesterManaged": true,
            "operator": {
                "managed": false
            },
            "status": "pending",
            "macAddress": "0e:95:2d:97:01:75",
            "privateIpAddress": "10.10.10.7",
            "privateDnsName": "ip-10-10-10-7.ec2.internal",
            "sourceDestCheck": true,
            "interfaceType": "interface",
            "groupSet": {
                "items": [
                    {
                        "groupId": "sg-0e2239cc74c5c84f9",
                        "groupName": "default"
                    }
                ]
            },
            "privateIpAddressesSet": {
                "item": [
                    {
                        "privateIpAddress": "10.10.10.7",
                        "privateDnsName": "ip-10-10-10-7.ec2.internal",
                        "primary": true
                    }
                ]
            },
            "ipv6AddressesSet": {},
            "ipv4PrefixSet": {
                "item": [
                    {
                        "ipv4Prefix": "10.10.10.16/28"
                    }
                ]
            },
            "denyAllIgwTraffic": true,
            "tagSet": {
                "items": [
                    {
                        "key": "VpcLatticeManaged",
                        "value": "true"
                    }
                ]
            }
        }
    },
    "requestID": "ab0bdbed-488c-4027-ba57-45ca932cd4cd",
    "eventID": "32c984c0-47c9-4b66-bd38-fecb28288079",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<AWSアカウントID>",
    "eventCategory": "Management"
}
2つ目
{
    "eventVersion": "1.10",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROA6KUFAVPUV2ZKYCUKD:LatticeAssumeRoleSession",
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/AWSServiceRoleForVpcLattice/LatticeAssumeRoleSession",
        "accountId": "<AWSアカウントID>",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROA6KUFAVPUV2ZKYCUKD",
                "arn": "arn:aws:iam::<AWSアカウントID>:role/aws-service-role/vpc-lattice.amazonaws.com/AWSServiceRoleForVpcLattice",
                "accountId": "<AWSアカウントID>",
                "userName": "AWSServiceRoleForVpcLattice"
            },
            "attributes": {
                "creationDate": "2024-12-19T08:18:56Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "vpc-lattice.amazonaws.com"
    },
    "eventTime": "2024-12-19T08:18:58Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateNetworkInterface",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "vpc-lattice.amazonaws.com",
    "userAgent": "vpc-lattice.amazonaws.com",
    "requestParameters": {
        "subnetId": "subnet-0f6a1ce53b9fd9793",
        "description": "VPC Endpoint Interface vpce-0e3b1bfc42d162c4a",
        "groupSet": {
            "items": [
                {
                    "groupId": "sg-0e2239cc74c5c84f9"
                }
            ]
        },
        "privateIpAddressesSet": {},
        "ipv4PrefixCount": 1,
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "network-interface",
                    "tags": [
                        {
                            "key": "VpcLatticeManaged",
                            "value": "true"
                        }
                    ]
                }
            ]
        },
        "clientToken": "e1b4231c-0596-4c1c-8f7c-9685b54bf288-IAD1-attach-grp-iad1-0278a549aef30dfd1-0",
        "denyAllIgwTraffic": true
    },
    "responseElements": {
        "requestId": "f20a7f2e-8117-48eb-9d95-c525dcb1204f",
        "networkInterface": {
            "networkInterfaceId": "eni-09199f7c86c4cddf9",
            "subnetId": "subnet-0f6a1ce53b9fd9793",
            "vpcId": "vpc-0d54cbe88a44ffd04",
            "availabilityZone": "us-east-1b",
            "description": "VPC Endpoint Interface vpce-0e3b1bfc42d162c4a",
            "ownerId": "<AWSアカウントID>",
            "requesterId": "396074869647",
            "requesterManaged": true,
            "operator": {
                "managed": false
            },
            "status": "pending",
            "macAddress": "02:e2:0e:16:f1:95",
            "privateIpAddress": "10.10.10.72",
            "privateDnsName": "ip-10-10-10-72.ec2.internal",
            "sourceDestCheck": true,
            "interfaceType": "interface",
            "groupSet": {
                "items": [
                    {
                        "groupId": "sg-0e2239cc74c5c84f9",
                        "groupName": "default"
                    }
                ]
            },
            "privateIpAddressesSet": {
                "item": [
                    {
                        "privateIpAddress": "10.10.10.72",
                        "privateDnsName": "ip-10-10-10-72.ec2.internal",
                        "primary": true
                    }
                ]
            },
            "ipv6AddressesSet": {},
            "ipv4PrefixSet": {
                "item": [
                    {
                        "ipv4Prefix": "10.10.10.96/28"
                    }
                ]
            },
            "denyAllIgwTraffic": true,
            "tagSet": {
                "items": [
                    {
                        "key": "VpcLatticeManaged",
                        "value": "true"
                    }
                ]
            }
        }
    },
    "requestID": "f20a7f2e-8117-48eb-9d95-c525dcb1204f",
    "eventID": "d8786655-e48a-47fe-9596-c90700d2c5e7",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<AWSアカウントID>",
    "eventCategory": "Management"
}

VPCエンドポイント作成時に指定したサブネットのそれぞれにENIを作成していることが分かります。

また、作成されたENIのIDを確認するとdescribe-vpc-endpointsの結果に含まれるENI IDと一致していることが分かります。

2つサブネットを指定したためENIは2つ作成されました。そのため、もうENIは作成しなくとも良い認識です。

後続のCreateNetworkInterfaceのイベントを確認します。

{
    "eventVersion": "1.10",
    "userIdentity": {
.
.
(中略)
.
.
    },
    "eventTime": "2024-12-19T08:19:11Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateNetworkInterface",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "vpc-lattice.amazonaws.com",
    "userAgent": "vpc-lattice.amazonaws.com",
    "requestParameters": {
        "subnetId": "subnet-0f6a1ce53b9fd9793",
        "description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
        "groupSet": {
            "items": [
                {
                    "groupId": "sg-0e2239cc74c5c84f9"
                }
            ]
        },
        "privateIpAddressesSet": {},
        "ipv4PrefixCount": 1,
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "network-interface",
                    "tags": [
                        {
                            "key": "VpcLatticeManaged",
                            "value": "true"
                        }
                    ]
                }
            ]
        },
        "clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0f6a1ce53b9fd9793-c4b30c7dc2a05705d7254ff5a4607382",
        "denyAllIgwTraffic": true
    },
    "responseElements": {
        "requestId": "09d2108d-4f4a-4d93-bb46-8bc414fc8420",
        "networkInterface": {
            "networkInterfaceId": "eni-0735a3b9f10ac264c",
            "subnetId": "subnet-0f6a1ce53b9fd9793",
            "vpcId": "vpc-0d54cbe88a44ffd04",
            "availabilityZone": "us-east-1b",
            "description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
            "ownerId": "<AWSアカウントID>",
            "requesterId": "396074869647",
            "requesterManaged": true,
            "operator": {
                "managed": false
            },
            "status": "pending",
            "macAddress": "02:59:5b:bb:e7:b1",
            "privateIpAddress": "10.10.10.77",
            "privateDnsName": "ip-10-10-10-77.ec2.internal",
            "sourceDestCheck": true,
            "interfaceType": "interface",
            "groupSet": {
                "items": [
                    {
                        "groupId": "sg-0e2239cc74c5c84f9",
                        "groupName": "default"
                    }
                ]
            },
            "privateIpAddressesSet": {
                "item": [
                    {
                        "privateIpAddress": "10.10.10.77",
                        "privateDnsName": "ip-10-10-10-77.ec2.internal",
                        "primary": true
                    }
                ]
            },
            "ipv6AddressesSet": {},
            "ipv4PrefixSet": {
                "item": [
                    {
                        "ipv4Prefix": "10.10.10.80/28"
                    }
                ]
            },
            "denyAllIgwTraffic": true,
            "tagSet": {
                "items": [
                    {
                        "key": "VpcLatticeManaged",
                        "value": "true"
                    }
                ]
            }
        }
    },
    "requestID": "09d2108d-4f4a-4d93-bb46-8bc414fc8420",
    "eventID": "5589d598-6dc7-4fef-8e13-bdffeb861169",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<AWSアカウントID>",
    "eventCategory": "Management"
}
{
    "eventVersion": "1.10",
    "userIdentity": {
.
.
(中略)
.
.
    },
    "eventTime": "2024-12-19T08:19:22Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateNetworkInterface",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "vpc-lattice.amazonaws.com",
    "userAgent": "vpc-lattice.amazonaws.com",
    "errorCode": "Client.InvalidParameterValue",
    "errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
    "requestParameters": {
        "subnetId": "subnet-0a84d8f4554925b16",
        "description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
        "groupSet": {
            "items": [
                {
                    "groupId": "sg-0e2239cc74c5c84f9"
                }
            ]
        },
        "privateIpAddressesSet": {},
        "ipv4PrefixCount": 1,
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "network-interface",
                    "tags": [
                        {
                            "key": "VpcLatticeManaged",
                            "value": "true"
                        }
                    ]
                }
            ]
        },
        "clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0a84d8f4554925b16-c4b30c7dc2a05705d7254ff5a4607382",
        "denyAllIgwTraffic": true
    },
    "responseElements": null,
    "requestID": "3b595aa9-79d4-4cfe-8b1e-2c5d6da16f3b",
    "eventID": "ae927c5d-6ff2-463f-9c7f-4828c48d947a",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<AWSアカウントID>",
    "eventCategory": "Management"
}
{
    "eventVersion": "1.10",
    "userIdentity": {
.
.
(中略)
.
.
    },
    "eventTime": "2024-12-19T08:19:34Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateNetworkInterface",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "vpc-lattice.amazonaws.com",
    "userAgent": "vpc-lattice.amazonaws.com",
    "errorCode": "Client.InvalidParameterValue",
    "errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
    "requestParameters": {
        "subnetId": "subnet-0a84d8f4554925b16",
        "description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
        "groupSet": {
            "items": [
                {
                    "groupId": "sg-0e2239cc74c5c84f9"
                }
            ]
        },
        "privateIpAddressesSet": {},
        "ipv4PrefixCount": 1,
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "network-interface",
                    "tags": [
                        {
                            "key": "VpcLatticeManaged",
                            "value": "true"
                        }
                    ]
                }
            ]
        },
        "clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0a84d8f4554925b16-c4b30c7dc2a05705d7254ff5a4607382",
        "denyAllIgwTraffic": true
    },
    "responseElements": null,
    "requestID": "586565b1-b04f-4fda-961a-bc540c1e2ecb",
    "eventID": "5be23df4-04a5-4fb1-818b-9c9e89222d3a",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<AWSアカウントID>",
    "eventCategory": "Management"
}
{
    "eventVersion": "1.10",
    "userIdentity": {
 .
.
(中略)
.
.
    },
    "eventTime": "2024-12-19T08:19:49Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateNetworkInterface",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "vpc-lattice.amazonaws.com",
    "userAgent": "vpc-lattice.amazonaws.com",
    "errorCode": "Client.InvalidParameterValue",
    "errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
    "requestParameters": {
        "subnetId": "subnet-0a84d8f4554925b16",
        "description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
        "groupSet": {
            "items": [
                {
                    "groupId": "sg-0e2239cc74c5c84f9"
                }
            ]
        },
        "privateIpAddressesSet": {},
        "ipv4PrefixCount": 1,
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "network-interface",
                    "tags": [
                        {
                            "key": "VpcLatticeManaged",
                            "value": "true"
                        }
                    ]
                }
            ]
        },
        "clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0a84d8f4554925b16-c4b30c7dc2a05705d7254ff5a4607382",
        "denyAllIgwTraffic": true
    },
    "responseElements": null,
    "requestID": "a0f1ab29-f6a4-4dce-a83c-580f83354444",
    "eventID": "194b190e-969a-4ec1-8b4f-b08f722c09be",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<AWSアカウントID>",
    "eventCategory": "Management"
}
{
    "eventVersion": "1.10",
    "userIdentity": {
.
.
(中略)
.
.
    },
    "eventTime": "2024-12-19T08:20:06Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateNetworkInterface",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "vpc-lattice.amazonaws.com",
    "userAgent": "vpc-lattice.amazonaws.com",
    "errorCode": "Client.InvalidParameterValue",
    "errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
    "requestParameters": {
        "subnetId": "subnet-0a84d8f4554925b16",
        "description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
        "groupSet": {
            "items": [
                {
                    "groupId": "sg-0e2239cc74c5c84f9"
                }
            ]
        },
        "privateIpAddressesSet": {},
        "ipv4PrefixCount": 1,
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "network-interface",
                    "tags": [
                        {
                            "key": "VpcLatticeManaged",
                            "value": "true"
                        }
                    ]
                }
            ]
        },
        "clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0a84d8f4554925b16-c4b30c7dc2a05705d7254ff5a4607382",
        "denyAllIgwTraffic": true
    },
    "responseElements": null,
    "requestID": "20aae5bf-11f7-4769-a218-5831b04a28d0",
    "eventID": "bc9a742e-4891-4bd8-8460-8ecb55ed6e5e",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<AWSアカウントID>",
    "eventCategory": "Management"
}
{
    "eventVersion": "1.10",
    "userIdentity": {
.
.
(中略)
.
.
    },
    "eventTime": "2024-12-19T08:20:27Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateNetworkInterface",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "vpc-lattice.amazonaws.com",
    "userAgent": "vpc-lattice.amazonaws.com",
    "errorCode": "Client.InvalidParameterValue",
    "errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
    "requestParameters": {
        "subnetId": "subnet-0a84d8f4554925b16",
        "description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
        "groupSet": {
            "items": [
                {
                    "groupId": "sg-0e2239cc74c5c84f9"
                }
            ]
        },
        "privateIpAddressesSet": {},
        "ipv4PrefixCount": 1,
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "network-interface",
                    "tags": [
                        {
                            "key": "VpcLatticeManaged",
                            "value": "true"
                        }
                    ]
                }
            ]
        },
        "clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0a84d8f4554925b16-c4b30c7dc2a05705d7254ff5a4607382",
        "denyAllIgwTraffic": true
    },
    "responseElements": null,
    "requestID": "1e09a42d-2da4-4477-9dbc-a659e99072f3",
    "eventID": "fc1e7390-ca76-4bdf-b7d3-0c35e0615a42",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<AWSアカウントID>",
    "eventCategory": "Management"
}

既にENI作成済みのsubnet-0f6a1ce53b9fd9793subnet-0a84d8f4554925b16にさらにENIを作成しようとしたことが分かります。

また、subnet-0f6a1ce53b9fd9793へのENI作成は正常に行われましたが、subnet-0a84d8f4554925b16は失敗しています。失敗の理由は軒並みThere aren't sufficient free Ipv4 addresses or prefixesです。

Service Network型VPCエンドポイントのENI作成リクエストのパラメーターを見るとわかるようにipv4PrefixCount1となっています。ipv4PrefixCountで指定した場合のipv4Prefixのサブネットマスクは/28です。そのため、ENIを作成するために/28の連続するIPアドレスが空いている必要があります。

subnet-0a84d8f4554925b16で使用しているIPアドレスは以下のとおりです。

aws ec2 describe-network-interfaces \
  --filters "Name=subnet-id,Values=subnet-0a84d8f4554925b16" \
  --query "NetworkInterfaces[].{PrivateIpAddress : PrivateIpAddress, Ipv4Prefixes : Ipv4Prefixes[].Ipv4Prefix}"
[
    {
        "PrivateIpAddress": "10.10.10.36",
        "Ipv4Prefixes": null
    },
    {
        "PrivateIpAddress": "10.10.10.7",
        "Ipv4Prefixes": [
            "10.10.10.16/28"
        ]
    },
    {
        "PrivateIpAddress": "10.10.10.13",
        "Ipv4Prefixes": null
    }
]

subnet-0a84d8f4554925b16のCIDRブロックは10.10.10.0/26です。先ほどの使用済みIPアドレスをマッピングすると以下のとおりです。

8.使用済みIPアドレスのマッピング.png

追加でIpv4Prefixesとして/28のサブネットマスクの領域を割り当てることがないことが分かります。

10.10.10.48/28が空いているのでは?」と思われるかもしれませんが、ブロードキャストアドレスである10.10.10.63/32と重複してしまっています。

Ipv4PrefixesはAWSによって予約されたIPアドレスを含むことができません。そのため、無理やり指定しようとしてもThe prefix 10.10.10.48/28 in subnet subnet-0a84d8f4554925b16 overlaps with reserved addresses.と怒られます。

9.The prefix 10.10.10.48:28 in subnet subnet-0a84d8f4554925b16 overlaps with reserved addresses..png

つまりは単純に「Service Network型VPCエンドポイントを配置するサブネットにはIPアドレスが/28 + /32 = 17個空いていれば良い」という訳ではありません。

なぜ、余計にENIを作成しようとするのか

ここで、「なぜ、Service Network型VPCエンドポイントを作成する際に余計にENIを作成しようとするのか」が気になります。

色々検証しましたが、結論わかりません。

検証結果をまとめると以下の通りです。

検証内容 指定したサブネット内のENIの状況 結果
/26の2つのサブネットの指定順番を入れ替える VPCエンドポイント以外のENIが2つ存在 ENIを複数作成しようとする
/26のサブネットを一つ指定 VPCエンドポイント以外のENIが2つ存在 ENIを複数作成しようとする
/26のサブネットを一つ指定 ENIなし ENIを一つ作成する
/25のサブネットを一つ指定 ENIなし ENIを一つ作成する
/25と/26のサブネットを指定する ENIなし ENIを複数作成しようとする
/25のサブネットの空きIPアドレスが58個の状態で指定 VPCエンドポイント以外のENIが1つ存在 ENIを一つ作成する

「/26だから」、「既にサブネットにENIがあるから」、「空きが少ないから」という理由がきっかけで1サブネットにENIを複数作成しようとする訳ではなさそうです。

Service Network型VPCエンドポイントを作成する場合は、残りのIPアドレスの個数だけではなく残りの/28のCIDRブロックが重要

Service Network型VPCエンドポイントの作成が失敗しても使える時の裏側を確認してみました。

余計にENIを作成しようとする原因は分かりませんが、Service Network型VPCエンドポイントを作成する場合は、残りのIPアドレスの個数だけではなく残りの/28のCIDRブロックが重要ということが分かりました。

残りのIPアドレスの個数だけで判断すると痛い目に遭いそうです。

また、VPCエンドポイントそれぞれに/28の割り当てが必要になるため、Service Networkを小分けにしており、Service Network型VPCエンドポイントを複数作成する必要がある場合はIPアドレスの確保に苦労すると予想します。/26だとVPCエンドポイントは作成できて2つまでです。

可能な限りService Networkに集約するか、Service Network型VPC Associationを使用しましょう。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.